package interfaz;

import org.uqbar.commons.model.UserException;

import org.uqbar.arena.actions.MessageSend;
import org.uqbar.arena.layout.VerticalLayout;
import org.uqbar.arena.widgets.Button;
import org.uqbar.arena.widgets.Label;
import org.uqbar.arena.widgets.Panel;
import org.uqbar.arena.widgets.Selector;
import org.uqbar.arena.widgets.tables.Column;
import org.uqbar.arena.widgets.tables.Table;
import org.uqbar.arena.windows.Dialog;
import org.uqbar.arena.windows.SimpleWindow;
import org.uqbar.arena.windows.Window;
import org.uqbar.lacar.ui.model.ControlBuilder;
import org.uqbar.lacar.ui.model.bindings.Binding;

import tablero.Coordenada;
import tablero.Esfera;
import tablero.Personaje;
import tablero.Posicionable;
import tablero.Tablero;
import com.uqbar.commons.collections.Transformer;

public class PrincipalWindow extends SimpleWindow<Tablero> {

	public PrincipalWindow(Window owner, Tablero model) {
		super(owner, model);
	}

	@Override
	public void createContents(Panel mainPanel) {
		mainPanel.setLayout(new VerticalLayout());

		Label lb = new Label(mainPanel);
		lb.bindValueToProperty(Tablero.TABLEROIMPRESO);

		Table<Posicionable> table = new Table<Posicionable>(mainPanel,
				Posicionable.class);
		table.bindContentsToProperty("elementos");
		table.bindSelection(Tablero.SELECTED);

		this.addColumns(table);

		Panel actionsPanel = new Panel(mainPanel);
		actionsPanel.setHorizontalLayout();

		new Selector(actionsPanel)
				.setContents(getModel().getPersonajes(), "nombre")
				.bindValueToProperty(Tablero.PERSONAJESELECTED);
		new Selector(actionsPanel)
				.setContents(getModel().getEsferas(), "nombre")
				.bindValueToProperty(Tablero.ESFERASELECTED);

		Button buscarEsf = new Button(actionsPanel);
		buscarEsf.setCaption("Buscar Esfera");
		buscarEsf.onClick(new MessageSend(this, "buscarEsfera"));

		Button nuevoPersonaje = new Button(mainPanel);
		nuevoPersonaje.setCaption("Nuevo Personaje");
		nuevoPersonaje.onClick(new MessageSend(this, "crearPersonaje"));
		Button nuevaEsfera = new Button(mainPanel);
		nuevaEsfera.setCaption("Nueva Esfera");
		nuevaEsfera.onClick(new MessageSend(this, "crearEsfera"));
		Button borrarElemento = new Button(mainPanel);
		borrarElemento.setCaption("Borrar Elemento");
		borrarElemento.onClick(new MessageSend(this, "borrarElemento"));

	}

	protected void addColumns(Table<Posicionable> table) {
		Column<Posicionable> contenidoColumn = new Column<Posicionable>(table);
		contenidoColumn.setTitle("Contenido");
		contenidoColumn.setPreferredSize(180);
		contenidoColumn.bindContentsToProperty("nombre");

		Column<Posicionable> cantidadColumn = new Column<Posicionable>(table);
		cantidadColumn.setTitle("Posición");
		cantidadColumn.setPreferredSize(180);
		cantidadColumn
				.bindContentsToTransformer(new Transformer<Posicionable, String>() {
					@Override
					public String transform(Posicionable elemento) {
						return elemento.getCoordenada().toString();
					}
				});

	}

	protected void addActions(Panel actionsPanel) {
	}

	public void crearPersonaje() {
		Dialog<?> crearPersonaje = new CrearPersonajeDialog(this,
				new Personaje(), this.getModel(), new Coordenada());

		crearPersonaje.open();
	}

	public void crearEsfera() {
		Dialog<?> crearEsfera = new CrearEsferaDialog(this, new Esfera(),
				this.getModel(), new Coordenada());

		crearEsfera.open();
	}

	public void borrarElemento() {
		getModel().quitarElemento(getModel().getSelected());

	}

	public void buscarEsfera() {
		Personaje currentPersonaje = this.getModel().getPersonajeSelected();
		Esfera currentEsfera = this.getModel().getEsferaSelected();
		if (currentPersonaje.puedeMoverseA(currentEsfera.getCoordenada())) {
			currentPersonaje.obtenerEsfera(currentEsfera);
			if (currentPersonaje.getCantEsferasObtenidas() == 7) {
				Dialog<?> llamarAShengLong = new LlamaraShengLong(this,	currentPersonaje);
				llamarAShengLong.open();
			}
		} else {
			throw new UserException("La esfera no está a su alcance");
		}
	}

	@Override
	protected void createFormPanel(Panel mainPanel) {
		// TODO Auto-generated method stub

	}

}
